package com.pai4j.user.repository.entity;

import jakarta.persistence.*;
import lombok.Data;

import java.util.Date;

/**
 * 统一待审核实体类
 * 用于统一管理所有类型的待审核数据，提供统一的查询和未读标记功能
 * 
 * 设计原则：
 * 1. 数据冗余：将业务表（AccountRelation、GroupJoinApplication等）的关键信息冗余到此表
 * 2. 统一接口：提供统一的查询、标记已读、未读统计接口
 * 3. 强一致性：通过事务保证本表和业务表的数据同步
 * 4. 可扩展性：通过approval_type字段支持多种待审核类型
 */
@Data
@Entity
@Table(name = "pai4j_pending_approval", indexes = {
        @Index(name = "idx_approver_type_status_isread", columnList = "approver_account,approval_type,approval_status,is_read"),
        @Index(name = "idx_biz_ref", columnList = "approval_type,biz_record_id"),
        @Index(name = "idx_create_time", columnList = "create_date")
})
public class PendingApprovalEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 待审核类型
     * @see com.pai4j.common.enums.PendingApprovalTypeEnum
     * 1=好友申请, 2=加群申请, 3=群邀请, 4=专题审核...
     */
    @Column(name = "approval_type", nullable = false)
    private Integer approvalType;

    /**
     * 申请人账号
     * 好友申请：发起好友申请的用户
     * 加群申请：申请加群的用户
     */
    @Column(name = "applicant_account", nullable = false, length = 64)
    private String applicantAccount;

    /**
     * 审批人账号
     * 好友申请：被添加的目标用户
     * 加群申请：群主或管理员
     * 群邀请：被邀请人
     */
    @Column(name = "approver_account", nullable = false, length = 64)
    private String approverAccount;

    /**
     * 关联目标ID
     * 好友申请：targetAccount（被添加的用户账号）
     * 加群申请：groupPaiId（群组ID）
     * 群邀请：groupPaiId（群组ID）
     */
    @Column(name = "target_id", nullable = false, length = 64)
    private String targetId;

    /**
     * 推荐人账号（可选）
     * 通过推荐卡片发起的好友申请/群邀请时，记录推荐人信息
     * null表示非推荐场景
     */
    @Column(name = "recommender_account", length = 64)
    private String recommenderAccount;

    /**
     * 申请留言
     */
    @Column(name = "application_message", length = 500)
    private String applicationMessage;

    /**
     * 审批状态
     * 1=待处理, 2=已同意, 3=已拒绝, 4=已过期
     * 不同业务类型的状态码保持一致，方便统一查询
     */
    @Column(name = "approval_status", nullable = false)
    private Integer approvalStatus;

    /**
     * 是否已读
     * false=未读，true=已读
     * 用于红点提示和未读数统计
     */
    @Column(name = "is_read", nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0")
    private Boolean isRead = false;

    /**
     * 业务表记录ID
     * 好友申请：AccountRelationEntity.id
     * 加群申请：GroupJoinApplicationEntity.id
     * 用于关联原始业务数据，实现双向同步
     */
    @Column(name = "biz_record_id", nullable = false)
    private Long bizRecordId;

    /**
     * 审批人账号（处理后记录）
     */
    @Column(name = "handled_by_account", length = 64)
    private String handledByAccount;

    /**
     * 审批时间
     */
    @Column(name = "approval_time")
    private Date approvalTime;

    /**
     * 审批意见
     */
    @Column(name = "approval_remark", length = 500)
    private String approvalRemark;

    /**
     * 过期时间
     */
    @Column(name = "expire_time")
    private Date expireTime;

    /**
     * 扩展字段（JSON格式）
     * 用于存储各业务类型特有的字段
     */
    @Column(name = "ext", columnDefinition = "json")
    private String ext;

    @Column(name = "create_date", nullable = false)
    private Date createDate;

    @Column(name = "update_date", nullable = false)
    private Date updateDate;
}
